package com.atguigu.juc;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author tongatong
 * @name CallableDemo
 * @description
 *   使用callable创建多线程
 *
 *   thread只支持runnable接口，可以使用两种方式使thread支持callable接口
 *   （1） 适配器（即某个类分别实现了callable接口和runnable接口）
 *   （2） 构造注入（某个类实现了runnable接口，但在构造函数中夹杂了callable接口）
 *
 *   FutureTask<V> 实现了runnable接口，并在构造函数中，夹带了callable接口
 *   
 *   FutureTask(Callable<V> callable)
 *   创建一个 FutureTask ，它将在运行时执行给定的 Callable 。
 *
 * @date 2021/9/1
 * @time 21:02
 */
public class CallableDemo {
    public static void main(String[] args) {
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "aaaa");

            return 1;
        });

        new Thread(futureTask, "callable").start();

        //获取返回值
        try {
            System.out.println("futureTask.get() = " + futureTask.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

/*
callable和runnable的不同
1. 方法名不同
2. 有无返回值（返回值类型由<V>泛型决定）
3. 能否抛出异常
 */
class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        return null;
    }
}
